/*
 * Copyright 2025-2026 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package hawk.demo;

import glz.hawkgenerator.java.ClassSpec;
import glz.hawkgenerator.java.JavaFile;
import glz.hawkgenerator.java.MethodSpec;
import glz.hawkgenerator.java.type.ArrayTypeName;
import glz.hawkgenerator.java.type.PrimitiveTypeName;

import javax.lang.model.element.Modifier;


public class SumMethodGenerator {

    public static void main(String[] args) {
        ClassSpec classSpec = ClassSpec.builder("SumMethodContainer", Modifier.PUBLIC)
                .addMethod(build2())
                .build();

        JavaFile javaFile = JavaFile.builder("com.example", classSpec)
                .build();

        javaFile.writeTo(System.out);
    }

    public static MethodSpec build1() {
        MethodSpec sum = MethodSpec.builder(PrimitiveTypeName.INT, "sum")
                .addParameter(ArrayTypeName.ofTypeName(ArrayTypeName.ofTypeName(PrimitiveTypeName.INT)), "a")
                .beginMethodBody()
                .addCode("int sum = 0;").addNewLine()
                .addCode("for (int i = 0; i < a.length; i++){").addNewLine()
                .addIndent()
                .addCode("for (int j = 0; j< a[i].length; j++){").addNewLine()
                .addIndent()
                .addCode("sum = sum + a[i][j];").addNewLine()
                .removeIndent()
                .addCode("}").addNewLine()
                .removeIndent()
                .addCode("}").addNewLine()
                .addCode("return sum;").addNewLine()
                .end()
                .build();
        return sum;
    }

    public static MethodSpec build2() {
        MethodSpec sum = MethodSpec.builder(PrimitiveTypeName.INT, "sum")
                .addParameter(ArrayTypeName.ofTypeName(ArrayTypeName.ofTypeName(PrimitiveTypeName.INT)), "a")
                .beginMethodBody()
                .addStatement("int sum = 0")
                .beginFor("int i = 0; i < a.length; i++")
                .beginFor("int j = 0; j < a[i].length; j++")
                .addStatement("sum = sum + a[i][i]")
                .endFor()
                .endFor()
                .end()
                .build();
        return sum;
    }

}
